<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <script>
    /** 数组去重
     * 给定一个数组[1,2,3,2,4,2]，编写一个函数去重，返回新数组，要求保持原顺序
     */
    function removeDuplicates(arr) {
      const seen = new Set();
      let res = [];
      for (const num of arr) {
        // 方案一：set集合去重 O(n)
        if (!seen.has(num)) {
          seen.add(num);
          res.push(num);
        }
        // 方案二：indexOf O(n^2)
        // if (res.indexOf(arr[i]) === -1) {
        //   res.push(arr[i]);
        // }
      }
      return res;
    }

    /**最长回文子串-中心扩展法
     * @param {string} s
     * @return {string}
     */
    var longestPalindrome = function (s) {
      // 输入：s = "babad"
      // 输出："bab"
      // 解释："aba" 同样是符合题意的答案。
      /**
       * 从给定的左右中心扩展，寻找最长回文子串
       * @param {string} s 输入字符串
       * @param {number} left 起始左索引
       * @param {number} right 起始右索引
       * @return {Object} 包含回文子串的起始和结束索引的对象
       */
      function expandAroundCenter(s, left, right) {
        while (left >= 0 && right < s.length && s[left] === s[right]) {
          left--;
          right++;
        }
        // 循环结束时，s[left] !== s[right]，因此回文的实际范围是 [left+1, right-1]
        return { start: left + 1, end: right - 1 };
      }

      if (s.length < 1) return '';
      let maxStart = 0,
        maxEnd = 0;
      for (let i = 0; i < s.length; i++) {
        // 奇数
        const res1 = expandAroundCenter(s, i, i);
        // 偶数
        const res2 = expandAroundCenter(s, i, i + 1);
        const len = maxEnd - maxStart + 1;
        const len1 = res1.end - res1.start + 1;
        const len2 = res2.end - res2.start + 1;
        if (len1 > len) {
          maxStart = res1.start;
          maxEnd = res1.end;
        }
        if (len2 > len) {
          maxStart = res2.start;
          maxEnd = res2.end;
        }
      }
      return s.substring(maxStart, maxEnd + 1);
    };
  </script>
  <body>
    <div style="padding: 20px; line-height: 1.6">
      <h2>前端算法常考的100题</h2>
      <p>涵盖数组、字符串、链表、树、动态规划等高频题型，适合大厂面试准备：</p>

      <h3>附加建议</h3>
      <ul>
        <li>重点掌握 <strong>数组、字符串、链表、树、动态规划</strong> 的经典题。</li>
        <li>理解每题的 <strong>时间复杂度优化</strong> 和 <strong>空间复杂度优化</strong> 思路。</li>
        <li>练习时尝试多种解法（如递归改迭代、双指针优化）。</li>
        <li>推荐结合 LeetCode 或《剑指Offer》进行针对性训练。</li>
      </ul>
      <p>如果需要具体题目链接或解析，可以进一步说明！</p>
      <div style="display: flex">
        <div>
          <h3>数组与字符串</h3>
          <ol>
            <li>两数之和</li>
            <li>三数之和</li>
            <li>最长无重复字符的子串</li>
            <li>盛最多水的容器</li>
            <li>移动零</li>
            <li>删除排序数组中的重复项</li>
            <li>合并两个有序数组</li>
            <li>最长回文子串</li>

            <li>旋转数组</li>
            <li>反转字符串</li>
            <li>有效的括号</li>
            <li>字符串转换整数 (atoi)</li>
            <li>字符串的排列（判断是否为子串的排列）</li>
            <li>无重复字符的最长子串</li>
            <li>最小覆盖子串（滑动窗口）</li>
            <li>字母异位词分组</li>
            <li>最长公共前缀</li>
            <li>回文子串计数</li>
            <li>反转字符串中的单词</li>
            <li>跳跃游戏</li>
          </ol>
        </div>
        <div>
          <h3>链表</h3>
          <ol start="21">
            <li>反转链表</li>
            <li>环形链表（检测环）</li>
            <li>合并两个有序链表</li>
            <li>删除链表的倒数第N个节点</li>
            <li>相交链表</li>
            <li>环形链表 II（找到环入口）</li>
            <li>合并K个升序链表</li>
            <li>复制带随机指针的链表</li>
            <li>链表排序（归并排序）</li>
            <li>回文链表</li>
          </ol>
        </div>
        <div>
          <h3>栈与队列</h3>
          <ol start="31">
            <li>用栈实现队列</li>
            <li>用队列实现栈</li>
            <li>最小栈</li>
            <li>有效的括号</li>
            <li>每日温度（单调栈）</li>
            <li>下一个更大元素 I</li>
            <li>柱状图中最大的矩形（单调栈）</li>
            <li>滑动窗口最大值（双端队列）</li>
            <li>逆波兰表达式求值</li>
            <li>基本计算器（处理加减乘除和括号）</li>
          </ol>
        </div>
        <div>
          <h3>树与二叉树</h3>
          <ol start="41">
            <li>二叉树的中序遍历（迭代/递归）</li>
            <li>二叉树的最大深度</li>
            <li>对称二叉树</li>
            <li>二叉树的层序遍历</li>
            <li>将有序数组转换为二叉搜索树</li>
            <li>验证二叉搜索树</li>
            <li>二叉树展开为链表</li>
            <li>二叉树的最近公共祖先</li>
            <li>路径总和 I/II/III</li>
            <li>二叉树的序列化与反序列化</li>
            <li>从前序与中序遍历序列构造二叉树</li>
            <li>完全二叉树的节点个数</li>
            <li>二叉树的右视图</li>
            <li>二叉树中的最大路径和</li>
            <li>平衡二叉树判断</li>
          </ol>
        </div>
        <div>
          <h3>动态规划</h3>
          <ol start="56">
            <li>爬楼梯</li>
            <li>最长递增子序列</li>
            <li>零钱兑换</li>
            <li>编辑距离</li>
            <li>不同路径 I/II</li>
            <li>打家劫舍 I/II/III</li>
            <li>最大子数组和</li>
            <li>乘积最大子数组</li>
            <li>单词拆分</li>
            <li>最长公共子序列</li>
            <li>分割等和子集</li>
            <li>正则表达式匹配</li>
            <li>地下城游戏</li>
            <li>买卖股票的最佳时机（多题型）</li>
            <li>三角形最小路径和</li>
          </ol>
        </div>
        <div>
          <h3>回溯与DFS/BFS</h3>
          <ol start="71">
            <li>全排列</li>
            <li>子集</li>
            <li>组合总和</li>
            <li>括号生成</li>
            <li>N皇后问题</li>
            <li>岛屿数量</li>
            <li>单词搜索</li>
            <li>分割回文串</li>
            <li>复原IP地址</li>
            <li>解数独</li>
          </ol>
        </div>
        <div>
          <h3>排序与搜索</h3>
          <ol start="81">
            <li>快速排序实现</li>
            <li>归并排序实现</li>
            <li>数组中的第K个最大元素</li>
            <li>搜索旋转排序数组</li>
            <li>在排序数组中查找元素的第一个和最后一个位置</li>
            <li>寻找峰值</li>
            <li>合并区间</li>
            <li>搜索二维矩阵 II</li>
            <li>前K个高频元素</li>
            <li>缺失的第一个正数</li>
          </ol>
        </div>
        <div>
          <h3>其他高频题型</h3>
          <ol start="91">
            <li>LRU缓存机制（双向链表+哈希表）</li>
            <li>实现 Trie（前缀树）</li>
            <li>最大矩形（基于柱状图优化的单调栈）</li>
            <li>接雨水</li>
            <li>任务调度器</li>
            <li>比特位计数</li>
            <li>汉明距离</li>
            <li>打乱数组（洗牌算法）</li>
            <li>用Rand7()实现Rand10()</li>
            <li>设计推特（设计题结合算法）</li>
          </ol>
        </div>
      </div>
    </div>
  </body>
</html>
